package com.bascker.algorithm.practice.arr.easy.find_poisoned_duration;

import java.util.Objects;

/**
 * 提莫攻击:
 *   在《英雄联盟》的世界中，有一个叫 “提莫” 的英雄，他的攻击可以让敌方英雄艾希进入中毒状态。现在，给出提莫对艾希的攻击时间序列和提莫攻击的
 *   中毒持续时间，你需要输出艾希的中毒状态总时长。 可认为提莫在给定的时间点进行攻击，并立即使艾希处于中毒状态。
 *   1. 假定时间序列数组的总长度不超过 10000.
 *   2. 假定提莫攻击时间序列中的数字和提莫攻击的中毒持续时间都是非负整数，并且不超过 10,000,000.
 *
 * For Example:
 *   in：[1,4], 2       out: 4
 *   in：[1,2], 2       out: 3
 *
 * @author bascker
 * @apiNote from leetcode T485
 */
public class Solution {

    // 线性扫描：时间复杂度 O(n)，空间复杂度 O(1)
    // 问题的关键在于处理中毒状态的持续时长 t。问题场景只有如下2种：
    // 1）前一次毒效较长 T[i] + d > T[i + 1]：中毒持续时间 t = T[i + 1] - T[i]
    // 2）前一次毒效较短T[i] + d <= T[i + 1]：中毒持续时间 t = d
    // 其中 d 为持续时间，T[i] 为攻击时间(秒)
    public int findPoisonedDuration(int[] timeSeries, int duration) {
        // 合法性校验
        if (Objects.isNull(timeSeries) || timeSeries.length == 0) {
            return 0;
        }

        int rs = 0;
        int n = timeSeries.length;
        // 此处的循环终止条件是 n - 1：避免数组越界
        for (int i = 0; i < n - 1; ++i) {
            rs += Math.min(timeSeries[i + 1] - timeSeries[i], duration);
        }

        // 处理最后一次攻击：一个完整的中毒时间
        return rs + duration;
    }

}
